// src/utils/request.ts（若放在common目录，路径改为src/common/request.ts）
import axios, { type AxiosRequestConfig, type AxiosResponse, AxiosError } from 'axios';

// 1. 创建 axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080', // 🎯 添加默认后端地址
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
});
// 2. 请求拦截器（添加token、处理请求参数）
request.interceptors.request.use(
  (config) => {
    // 从localStorage获取token（用户登录后存储的身份凭证）
    const token = localStorage.getItem('token');
  if (token && config.headers) {
      // 🎯 修复：使用后端期望的 token 头（不是 Authorization）
      config.headers.token = token;

      // 🎯 移除或注释掉这行：
      // config.headers.Authorization = `Bearer ${token}`;
    }

    // 处理GET请求参数
    if (config.method === 'get' && config.params) {
      Object.keys(config.params).forEach(key => {
        if (config.params[key] === null || config.params[key] === undefined) {
          delete config.params[key];
        }
      });
    }

    return config;
  },
  (error: AxiosError) => {
    console.error('请求拦截错误:', error);
    return Promise.reject(error);
  }
);

// 3. 响应拦截器（统一处理响应、错误码）
request.interceptors.response.use(
  (response: AxiosResponse) => {
    // 后端返回格式：{ success: boolean, data?: any, message?: string, ... }（与你后端一致）
    const res = response.data;

    // 情况1：响应成功（success为true）
    if (res.success) {
      return res; // 直接返回后端数据（如{ success: true, data: {...}, message: "成功" }）
    }
    // 情况2：响应失败（success为false，如参数错误、业务逻辑错误）
    else {
      // 提示错误信息（可替换为你的UI组件提示，如ElMessage）
      alert(`操作失败：${res.message || '未知错误'}`);
      return Promise.reject(new Error(res.message || '业务逻辑错误'));
    }
  },
  (error: AxiosError) => {
    // 网络错误、服务器错误等
    console.error('响应拦截错误:', error);

    // 分类处理错误
    let errorMsg = '网络异常，请检查网络连接';
    if (error.response) {
      // 有响应状态码（如401、404、500）
      const status = error.response.status;
      switch (status) {
        case 401: // 未登录、token过期
          errorMsg = '登录已过期，请重新登录';
          // 清除本地存储，跳转登录页
          localStorage.removeItem('token');
          localStorage.removeItem('userId');
          window.location.href = '/Login'; // 替换为你的登录页路径
          break;
        case 403: // 权限不足
          errorMsg = '权限不足，无法操作';
          break;
        case 404: // 接口不存在
          errorMsg = '请求的接口不存在';
          break;
        case 500: // 服务器错误
          errorMsg = '服务器内部错误，请稍后再试';
          break;
        default:
          errorMsg = `请求错误（${status}）`;
      }
    } else if (error.request) {
      // 无响应（如超时、网络断开）
      errorMsg = '请求超时，请检查网络';
    }

    // 提示错误（可替换为UI组件）
    alert(errorMsg);
    return Promise.reject(new Error(errorMsg));
  }
);

// 4. 导出请求方法（支持直接调用 request.get/post 或封装的方法）
export { request };

// 可选：封装常用请求方法（简化调用，可根据需要添加）
export const http = {
  get<T = unknown>(url: string, params?: unknown, config?: AxiosRequestConfig): Promise<T> {
    return request.get(url, { params, ...config });
  },
  post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
    return request.post(url, data, config);
  },
  put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {
    return request.put(url, data, config);
  },
  delete<T = unknown>(url: string, params?: unknown, config?: AxiosRequestConfig): Promise<T> {
    return request.delete(url, { params, ...config });
  },
};
